/**
 * @Description: 闭包函数
 * @Version: 1.0
 * @Author: 琴时
 * @Date: 2021-11-28 14:01:42
 * @LastEditors: 琴时
 * @LastEditTime: 2021-11-30 09:59:25
 * @FilePath: \pt-utils\src\utils_transform\闭包.js
 */

/**
 * 返回闭包函数中的参数
 */
function fn1() {
  let name = 'hello world!'
  return function () {
    return name
  }
}
/* 测试用例 */
const fn2 = fn1()
console.log('测试:', fn2())

/**
 * 函数赋值
 */
let fn3
function fn4(params) {
  let name = 'hello world!'
  fn3 = function () {
    return name
  }
}
fn4()
console.log('测试:', fn3())

/**
 * 函数参数
 */
function fn5() {
  let name = 'hello world!'
  return function () {
    return name
  }
}
let fn6 = fn5()
function fn7(fn) {
  console.log('测试:', fn())
}
fn7(fn6)
/**
 * 自执行函数
 */
;(function () {
  let name = 'hello world!'
  let fn = function () {
    return name
  }
  fn8(fn)
})()
function fn8(fn) {
  console.log('测试:', fn())
}

/**
 * 循环赋值
 */
// for (var i = 0; i < 5; ++i) {
//   setTimeout(function () {
//     console.log(i)
//   }, 0)
// }

// for (let i = 0; i < 5; i++) {
//   /* 每秒执行一次 */
//   ;(function (j) {
//     setTimeout(() => {
//       console.log('测试每秒执行一次循环:', j)
//     }, j * 1000)
//   })(i)
// }

// for (let i = 0; i < 5; ++i) {
//   setTimeout(function () {
//     console.log(i)
//   }, i * 1000)
// }

/**
 * getter/setter
 */
function fn9() {
  let name = '琴时'
  const setName = function (n) {
    name = n
  }
  const getName = function () {
    return name
  }

  return {
    setName,
    getName,
  }
}

let fn10 = fn9()
console.log('测试:', fn10.getName())
fn10.setName('张三') //修改闭包属性值
console.log('测试:', fn10.getName())

/**
 * 迭代器
 */
let arr = ['aa', 'bb', 'cc']
function iterator(arr) {
  let i = 0
  return function () {
    return arr[i++] || '已遍历完成'
  }
}
let next = iterator(arr)
console.log('测试:', next()) //aa
console.log('测试:', next()) //bb
console.log('测试:', next()) //cc
console.log('测试:', next()) //已遍历完成

/**
 * 首次区分
 * 相同的参数，函数不会重复执行
 */

let firstFn = (function () {
  let tempList = [] //缓存执行过的参数数组(函数内部变量)
  return function (params) {
    if (tempList.indexOf(params) === -1) {
      tempList.push(params)
      console.log('测试,执行:', tempList)
    } else {
      console.log('测试,不执行:',params)
    }
  }
})()
firstFn(10)
firstFn(10)
firstFn(100)
firstFn(1000)
firstFn(200)
firstFn(1000)


